package com.gh.ok.common

import android.os.Build
import android.util.Log
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.decode.GifDecoder
import coil.decode.ImageDecoderDecoder
import coil.decode.SvgDecoder
import coil.disk.DiskCache
import coil.memory.MemoryCache
import coil.util.DebugLogger
import com.aleyn.cache.CacheManager
import com.aleyn.cache.CacheMode
import com.ok.common.BuildConfig
import com.ok.common.base.BaseApplication
import com.ok.common.exception.ErrorCode
import com.ok.common.exception.HandleException

class App : BaseApplication(), ImageLoaderFactory {

    companion object {
        private const val TAG = "App"
    }

    override fun onCreate() {
        super.onCreate()
        initNetCache()
        initGlobalHandleException()
    }

    /**
     * 全局网络请求异常
     */
    private fun initGlobalHandleException() {
        HandleException.setListener { e ->
            Log.e(TAG, "全局异常：" + e.msg)
            if (e.code == ErrorCode.TOKEN_ERROR.code) { //Token失效/过期

            }
        }
    }

    /**
     * 全局网络请求缓存配置
     */
    private fun initNetCache() {
        CacheManager.setCacheModel(CacheMode.NETWORK_PUT_READ_CACHE) // 先请求网络，网络请求失败使用缓存(未过期缓存)
            .setCacheTime(5 * 60 * 60 * 1000) // 设置全局过期时间(毫秒)
            .useExpiredData(true) // 缓存过期时是否继续使用，仅对ONLY_CACHE生效
    }

    /**
     * 全局Coil配置
     */
    override fun newImageLoader(): ImageLoader {
        return ImageLoader.Builder(this).components {
            if (Build.VERSION.SDK_INT >= 28) {
                add(ImageDecoderDecoder.Factory())
            } else {
                add(GifDecoder.Factory())
            }
            add(SvgDecoder.Factory())
        }.memoryCache {
            MemoryCache.Builder(this)
                // 设置为应用可用内存的20%
                .maxSizePercent(0.2).build()
        }.diskCache {
            DiskCache.Builder().directory(this.cacheDir.resolve("image_disk_cache"))
                .maxSizeBytes(512L * 1024 * 1024) //512MB
                .build()
        }.crossfade(true).respectCacheHeaders(false)
            .apply { if (BuildConfig.DEBUG) logger(DebugLogger()) }.build()
    }

}